[Talend] サンプルデータを持ったテーブルを簡単に作成する
前回の記事「[Redshift] ASCII は廃止されたリーダーノード専用関数です」にて、ベンチマークテストの際に使用するサンプルコードを持ったテーブルを Talend Open Studio を使って作成しました。今回は私が頭の中で考えたことに沿った作成手順をご紹介したいと思います。
サンプルテーブルの作成
こういうの Talend で作ると楽ちんなんだよなあ。
ということで Talend Open Studio を起動し、コンテキストメニューからジョブを作成します。
ジョブ名は「CreateSampleTable」としました。ド直球です。
とりあえず DB に接続できないとね。
リポジトリ内にある「DB接続」を選択し、コンテキストメニューから「DB接続の作成」を選択します。
接続名称は「CMRedshift」としました。
名前の通り今回のデータベースは Redshift なので、「DBタイプ」は「Redshift」を選択します。
必要事項を入力していき、「チェック」ボタンを押下します。
接続が成功しました!
さて、ジョブを構築していくかな。
まずはデータベース接続コンポーネントっと。
先ほど作成した CMRedshift を選択し、そのままジョブエリアへドラッグアンドドロップします。
ダイアログが表示されますので「tRedshiftConnection」を選択します。
ジョブエリアに置かれた CMRedshift (tRedshiftConnection) を選択し、「詳細設定」の「自動コミット」をチェックします。今回はロールバックなどは考慮しないので自動コミットとしましたが、コミットコンポーネント、ロールバックコンポーネントを用いてより詳細に制御することも可能です。
あのコンポーネント、ASCII 文字 4 桁のランダムなデータ作れたっけかな?
そのコンポーネントは「tRowGenerator」といいます。様々な行データを指定の数だけ作り出すことができます。
ジョブエリアへ設置しました。
CMRedshift を選択、コンテキストメニューから「トリガー」「コンポーネントがOKの場合」を選択し tRowGenerator と接続します。CMRedshift が正常に評価されたら tRowGenerator の処理へ移ることを意図しています。
tRowGenerator を選択し、コンポーネントの基本設定ビューから「ロウジェネレーターエディター」ボタンを押下します。
エディターウィンドウが表示されました。
「追加」ボタンを押下すると行が追加されます。
ファンクションを選択すると「TalendString.getAsciiRandomString(int)」というものがありました。まさにコレって感じですね。
標準では length が 6 となっているので 4 へ変更します。
生成する行数は 1 千万件!
プレビューを使ってどのような行データが作成されるか確認することができます。
4 桁の ASCII 文字が生成されました!……が、なんか大文字と小文字が混じっててコードっぽくない……。(個人的な所感です。)
英字は大文字にしたいなあ。
そんな時はいろんなことが出来る「tMap」コンポーネントです。
ジョブエリアへ配置したら tRowGenerator と繋ぎます。tRowGenerator で作り出された行データを受け取るので接続は「ロウ>メイン」となります。
繋がりました。これで tMap コンポーネントは tRowGenerator が作り出した行データをガシガシ受け取って処理します。
tMap コンポーネントをダブルクリックするとエディタが開きます。このエディタを使って「英小文字を英大文字」へ変換する処理を設定していきます。
変換したものは出力しなければならないので、まずは出力テーブルを追加します。
出力名は「out1」そのままで。
次に出力テーブルにカラムを追加します。
カラム名は「SAMPLE_CODE」、型は文字列です。
今回は中央の「変数」を利用して大文字化します。追加ボタンを押下して変数を追加します。
入力側の「newColumn」を変数へドラッグアンドドロップして紐付けたら、式のボタンを押下して式ビルダを表示します。
入力された newColumn データを toUpperCase() メソッドで大文字化します。今回 tRowGenerator は null は作り出さないのでこれでよいでしょう。
OK ボタンで式ビルダを閉じたら、変数「var1」を出力テーブルの「SAMPLE_CODE」へ紐付けます。
これでこの tMap には「入力(newColumn)→大文字化→出力(SAMPLE_CODE)」という変換処理が定義されました。
後はデータベースへ出力するだけ。
テーブルは作成しなくていいのかって?
データベース上のテーブルへ、行データを出力するにはデータベース出力コンポーネントを使います。今回は Redshift なので「tRedshiftOutput」ですね。(MySQL なら tMysqlOutput)
tMap のエディタ内で作成した出力テーブル「out1」を tRedshiftOutput へ繋げます。
tRedshiftOutput の接続設定には CMRedshift を使います。「既存の接続を使用」にチェックを入れると接続情報を使い回しできます。
テーブルは存在していませんが、とりあえず「sample_codes」テーブルとしました。
ここでデータベース出力コンポーネントの便利機能、「テーブルアクション」設定です。
なんと行データのカラム情報からテーブルを作成することができるのです。便利ですね。
今回は「ある時、削除し、テーブル作成」としています。なぜカタコト……。
繋いだ時点でカラム情報は同期されますが、念のため「Sync columns」を押下しておきましょう。
今回件数が多いので、バルクインサートを使用します。
INSERT INTO cm_inage_toru.sample_codes VALUES ('HOGE'); INSERT INTO cm_inage_toru.sample_codes VALUES ('PIYO'); INSERT INTO cm_inage_toru.sample_codes VALUES ('FUGA'); -- ではなく INSERT INTO cm_inage_toru.sample_codes VALUES ('HOGE'), ('PIYO'), ('FUGA');
詳細設定に「挿入毎の行数」という項目があるので、この数値を変更します。
さあ、実行!
ジョブが完成しましたので実行してみましょう。
処理が進み……
こんな感じで正常終了すれば、4 桁の ASCII 文字列からなるデータが 1 千万件入った sample_codes テーブルがサクッと用意されます。(時間がかかるので画像では 10 万件になっています。)
まとめ
画像入りでつらつらと長くなってしまいましたが、実際に行っている作業は「コンポーネントを 4 つ配置する」「それぞれのコンポーネントを適切に設定する」だけです。
「データ入りのテーブル作成したいけど面倒だなあ。」という時には Talend オススメです。